# 代码抽取
import json
from urllib.parse import urlencode, parse_qs
from urllib.request import urlopen

from django.conf import settings


class QQOauth(object):

    def get_url(self):
        # 有base_url
        base_url = 'https://graph.qq.com/oauth2.0/authorize?'

        state = '/'

        # 组织参数
        params = {
            'response_type': 'code',
            'client_id': settings.QQ_APP_ID,
            'redirect_uri': settings.QQ_REDIRECT_URL,
            'state': state,
            'scope': 'get_user_info',
        }

        # 生成url
        # http://xxxx?key=value&key=value
        # 将query字典转换为url路径中的查询字符串
        # urllib.parse.urlencode(query)

        auth_url = base_url + urlencode(params)

        return auth_url

    def get_token(self, code):
        # 通过code获得token
        # PC网站：https://graph.qq.com/oauth2.0/token
        # GET
        # grant_type      必须      授权类型，在本步骤中，此值为“authorization_code”。
        # client_id       必须      申请QQ登录成功后，分配给网站的appid。
        # client_secret   必须      申请QQ登录成功后，分配给网站的appkey。
        # code            必须      上一步返回的authorization
        # redirect_uri    必须      与上面一步中传入的redirect_uri保持一致。
        base_url = 'https://graph.qq.com/oauth2.0/token?'
        params = {
            'grant_type': 'authorization_code',
            'client_id': settings.QQ_APP_ID,
            'client_secret': settings.QQ_APP_KEY,
            'code': code,
            'redirect_uri': settings.QQ_REDIRECT_URL
        }

        # 生成url
        token_url = base_url + urlencode(params)

        # 生成的url我们需要自己请求
        response = urlopen(token_url)

        # data是字符串类型
        data = response.read().decode()
        # print(data)

        # 把字符串转换为字典
        dict = parse_qs(data)
        # print(dict['access_token'])

        # dict['access_token']是一个列表
        access_token = dict['access_token']

        token = access_token[0]

        return token

    def get_openid(self, token):
        # https://graph.qq.com/oauth2.0/me
        # GET
        # access_token 必须在Step1中获取到的accesstoken。

        base_url = 'https://graph.qq.com/oauth2.0/me?'

        params = {
            'access_token': token
        }

        openid_url = base_url + urlencode(params)

        # 通过urlopen(openid_url)来获取数据
        response = urlopen(openid_url)

        # data是json字典数据
        data = response.read().decode()

        print(data)
        # 'callback( {"client_id":"101474184","openid":"E44AC2B46CFC90A0D4211D8940D1F0F2"} );'

        try:
            # 从字符串中通过切片截取字典的部分：｛｝中的内容
            dict = json.loads(data[10:-4])
        except Exception:
            raise Exception("数据获取失败")
        # print(dict)

        openid = dict.get('openid')

        if openid is not None:
            # 返回openid
            return openid
